package com.foo.designpattern.factory.simplefactory;

import junit.framework.Assert;
import junit.framework.TestCase;

/**
 * com.foo.designpattern.factory.simplefactory
 * Created with IntelliJ IDEA.
 * Created by jiang on 2016-05-09 14:59.
 *
 * @Description 测试类：简单工厂模式(静态工厂模式)
 * 静态工厂模式存在的目的很简单：定义一个用于创建对象的接口。
 * <p/>
 * 下面我们从开闭原则(对扩展开放，对修改关闭)上来分析下静态工厂模式。
 * 当客户不再满足于现有的车型的时候，想要一种新型车。
 * 只要这种车复合抽象产品指定的合同，那么只要通知工厂类知道就可以了。
 * 所以对产品部分来说，它是符合开闭原则的，但是工厂部分好像不大理想，
 * 因为每增加一种新车型，都要在工厂类中增加相应的创建业务逻辑(createBMW(int type)方法需要新增case)，
 * 这显然是违背开闭原则的。可想而知对于型产品的加入，工厂类是很被动的。
 * 如果产品是一个多层次的树状结构，那么工厂类需要添加太多的代码来对应这些产品，会把工厂类累坏了，也累坏了修改它的程序员。
 * 于是，工厂方法模式作为救世主出现了。工厂类定义成了接口，而每新增一个车型，就增加该车型对应的工厂类的实现，
 * 这样，工厂的设计就可以扩展了，而不必去修改原来的代码。
 */

public class SimpleFactoryTestCase extends TestCase {
    public void testSimpleFactory() {
        System.out.println("= = = = ↓↓↓静态工厂模式，测试开始↓↓↓ = = = =");

        // 初始化工厂类，获取工厂实例
        Factory factory = new Factory();
        // 根据客户要求，工厂生产BMW320
        BMW bmw320 = factory.createBMW(320);
        Assert.assertEquals("制造 --> BMW320", bmw320.createBMW());
        // 根据客户要求，工厂生产BMW523
        BMW bmw523 = factory.createBMW(523);
        Assert.assertEquals("制造 --> BMW523", bmw523.createBMW());

        System.out.println("= = = = ↑↑↑静态工厂模式，测试结束↑↑↑ = = = =");
    }
}
